package spring_hibernateannotations;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import spring_hibernateannotations.interfaces.IBanco;
import spring_hibernateannotations.modelo.Livro;

public class BancoDados implements IBanco {
	private SessionFactory sessionFactory;
	 
	private Session sessao;
 
	private Transaction transacao;
 
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
		this.sessao = sessionFactory.openSession();
	}

	@Override
	public Livro InserirLivro(Livro livro) {
		try {
			if(!sessao.isOpen()) {
				sessao = sessionFactory.openSession();
			}
			transacao = sessao.beginTransaction();
			int cod = (Integer) sessao.save(livro);
			transacao.commit();
			livro.setCod(cod);
		}
		catch(HibernateException e) {
			System.out.println("Erro: " + e.getMessage());
			transacao.rollback();
		}
		finally {
			try {
				if(sessao.isOpen()) {
					sessao.close();
				}
			}
			catch(Throwable e)
			{
				System.out.println("Erro ao finalizar inserção: " + e.getMessage());
			}
		}
 
		return livro;
	}

	@Override
	public void AtualizarLivro(Livro livro) {
		try {
			if(!sessao.isOpen()) {
				sessao = sessionFactory.openSession();
			}
			transacao = sessao.beginTransaction();
			sessao.update(livro);
			transacao.commit();
		}
		catch(HibernateException e)
		{
			System.out.println("Erro: " + e.getMessage());
			transacao.rollback();
		}
		finally {
			try {
				if(sessao.isOpen()) {
					sessao.close();
				}
			}
			catch(Throwable e){
				System.out.println("Erro ao finalizar atualização: " + e.getMessage());
			}
		}

	}

	@Override
	public void ApagarLivro(Livro livro) {
		try {
			if(!sessao.isOpen()) {
				sessao = sessionFactory.openSession();
			}
			transacao = sessao.beginTransaction();
			sessao.delete(livro);
			transacao.commit();
		}
		catch(HibernateException e) {
			System.out.println("Erro: " + e.getMessage());
			transacao.rollback();
		}
		finally {
			try {
				if(sessao.isOpen()) {
					sessao.close();
				}
			}
			catch(Throwable e) {
				System.out.println("Erro ao finalizar : " + e.getMessage());
			}
		}

	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Livro> SelecionarLivrosPorTitulo(String titulo) {
		if(!sessao.isOpen()) {
			sessao = sessionFactory.openSession();
		}
		Criteria criteria = sessao.createCriteria(Livro.class);
		criteria.add(Restrictions.like("titulo", titulo));
		return criteria.list();
	}

	@Override
	public Livro SelecionarLivroPorCodigo(int cod) {
		if(!sessao.isOpen()) {
			sessao = sessionFactory.openSession();
		}
		Criteria criteria = sessao.createCriteria(Livro.class);
		criteria.add(Restrictions.eq("cod", cod));
		Livro livro = (Livro) criteria.uniqueResult();
		return livro;
	}

}
